﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace Foasis.Video
{
	/// <summary>
	/// 提供视频流属性、方法基类。
	/// </summary>
	public abstract class Video : IVideo
	{
		// Sakura 修改于 2011/06/18，修改注释错误
		/// <summary>
		/// 当前帧编号。
		/// </summary>
		public abstract int CurrentFrameNumber
		{
			get;
			set;
		}

		/// <summary>
		/// 当前帧类型（关键、空白、一般）。
		/// </summary>
		public abstract FrameType CurrentFrameType
		{
			get;
		}

		/// <summary>
		/// 该视频所含帧数。
		/// </summary>
		public abstract int FrameCount
		{
			get;
		}

		/// <summary>
		/// 该视频帧速率。
		/// </summary>
		public abstract double FrameRate
		{
			get;
		}

		/// <summary>
		/// 该视频高度。
		/// </summary>
		public abstract int Height
		{
			get;
		}

		/// <summary>
		/// 该视频尺寸。
		/// </summary>
		public abstract Size Size
		{
			get;
		}

		/// <summary>
		/// 该视频宽度。
		/// </summary>
		public abstract int Width
		{
			get;
		}

		/// <summary>
		/// 帧时间点（毫秒）。
		/// </summary>
		public abstract double[] FrameTime
		{
			get;
		}

		/// <summary>
		/// 得到当前帧信息。
		/// </summary>
		/// <param name="output">位图信息。</param>
		public virtual void GetFrame(ref Bitmap output)
		{
			this.GetFrame(ref output, this.CurrentFrameNumber);
		}

		/// <summary>
		/// 得到指定帧信息。
		/// </summary>
		/// <param name="output">位图信息。</param>
		/// <param name="frameNumber">帧序号。</param>
		public abstract void GetFrame(ref Bitmap output, int frameNumber);

		/// <summary>
		/// 得到当前帧信息。
		/// </summary>
		/// <param name="outData">当前帧像素数据。</param>
		/// <param name="ColorSpace">输出数据的色彩空间。</param>
		public virtual void GetFrame(out byte[] outData, AviSynth.AviSynthColorspace ColorSpace)
		{
			this.GetFrame(out outData, this.CurrentFrameNumber, ColorSpace);
		}

		/// <summary>
		/// 得到指定帧信息。
		/// </summary>
		/// <param name="outData">指定帧像素数据。</param>
		/// <param name="frameIndex">帧序号。</param>
		/// <param name="ColorSpace">输出数据的色彩空间。</param>
		public abstract void GetFrame(out byte[] outData, int frameIndex, AviSynth.AviSynthColorspace ColorSpace);

		/// <summary>
		/// 打开视频。
		/// </summary>
		/// <param name="filePath">视频路径。</param>
		public abstract void Open(string filePath);

		/// <summary>
		/// 关闭视频。
		/// </summary>
		public abstract void Close();
	}
}
